all repos — caroster @ 8a3e8f58e43a20afa617f25756e5a3de0b2d0300

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/waitingList.tsx (view raw)

 1import {useState, useMemo, PropsWithChildren} from 'react';
 2import EventLayout, {TabComponent} from '../../../layouts/Event';
 3import {EventByUuidDocument} from '../../../generated/graphql';
 4import useProfile from '../../../hooks/useProfile';
 5import WaitingList from '../../../containers/WaitingList';
 6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
 7import pageUtils from '../../../lib/pageUtils';
 8
 9interface NewPassengerDialogContext {
10  addSelf: boolean;
11}
12
13interface Props {
14  eventUUID: string;
15}
16
17const Page = (props: PropsWithChildren<Props>) => {
18  return <EventLayout {...props} Tab={WaitingListTab} />;
19};
20
21const WaitingListTab: TabComponent = ({event}) => {
22  const {userId} = useProfile();
23  const [addPassengerToWaitingListContext, toggleNewPassengerToWaitingList] =
24    useState<NewPassengerDialogContext | null>(null);
25
26  const canAddSelf = useMemo(() => {
27    if (!userId) return false;
28    const isInWaitingList = event?.waitingPassengers?.data?.some(
29      passenger => passenger.attributes.user?.data?.id === `${userId}`
30    );
31    const isInTravel = event?.travels?.data?.some(travel =>
32      travel.attributes.passengers?.data?.some(
33        passenger => passenger.attributes.user?.data?.id === `${userId}`
34      )
35    );
36    return !(isInWaitingList || isInTravel);
37  }, [event, userId]);
38
39  return (
40    <>
41      <WaitingList
42        canAddSelf={canAddSelf}
43        getToggleNewPassengerDialogFunction={(addSelf: boolean) => () =>
44          toggleNewPassengerToWaitingList({addSelf})}
45      />
46      {!!addPassengerToWaitingListContext && (
47        <AddPassengerToWaitingList
48          open={!!addPassengerToWaitingListContext}
49          toggle={() => toggleNewPassengerToWaitingList(null)}
50          addSelf={addPassengerToWaitingListContext.addSelf}
51        />
52      )}
53    </>
54  );
55};
56
57export const getServerSideProps = pageUtils.getServerSideProps(
58  async (context, apolloClient) => {
59    const {uuid} = context.query;
60    const {host = ''} = context.req.headers;
61
62    // Fetch event
63    const {data} = await apolloClient.query({
64      query: EventByUuidDocument,
65      variables: {uuid},
66    });
67    const event = data?.eventByUUID?.data;
68
69    return {
70      eventUUID: uuid,
71      metas: {
72        title: event?.attributes?.name || '',
73        url: `https://${host}${context.resolvedUrl}`,
74      },
75    };
76  }
77);
78
79export default Page;